﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MYSQL_db.Mwcard
{
    class OptCard
    {
        public static string IniPass = "FFFFFFFFFFFF";  //厂家初始密码
        public static string NewPass = "414855545953";//发开更改新密码AHUTYS
        public static string PassB = "535954554841";
        public static int icdev; // 通讯设备标识符
       // public static int sector;//扇区号
        public static uint snr = 0;//存放读取的卡序列号
        public static byte size = 0; //指向返回的卡容量的数据
        //返回API版本号
        public static string SoftVersion()
        {
            byte[] ver = new byte[30];  //存储查询到软件版本号缓冲区
            common.lib_ver(ver);//读取软件版本号，装入缓冲区
            string sver = System.Text.Encoding.ASCII.GetString(ver); //得到软件版本号字符串
            return sver;
       
        }
        //返回读写器硬件版本号
        public static string HardDevVersion()
        {
            byte[] dev_ver = new byte[30];
            common.rf_get_status(icdev, dev_ver); //取得读写器硬件版本号
            return System.Text.Encoding.ASCII.GetString(dev_ver);
        }

        //修改出厂密码
        public static Boolean ChangePass(int sector)
        {
            string data = NewPass+"ff078069"+PassB;
            byte[] data1 = System.Text.Encoding.Default.GetBytes(data);
            if (mifareone.rf_write_hex(icdev, sector * 4 + 3, data1) != 0)
            {         
                return false;
            }         
            return true;
        }

        //PC连接读写器,返回true连接成功
        public static Boolean ConnectDev()
        {
           icdev = common.rf_init(0, 9600);
           // icdev = common.Open_USB();
            if (icdev > 0)      //说明icdev是设备是否连接的标志
            {
                return true;
            }
            else
                return false;
        }
        //PC连接读写器,返回true连接成功
        public static Boolean ConnectDevOnWin7()
        {
         //   icdev = common.rf_init(0, 9600);
             icdev = common.Open_USB();
            if (icdev > 0)      //说明icdev是设备是否连接的标志
            {
                return true;
            }
            else
                return false;
        }




        //断开PC与读写器的连接,断开成功返回true
        public static Boolean DisConnectDev()
        {
            if (icdev > 0)
            {
                //common.Close_USB(icdev);
                //if (common.Close_USB(icdev) == 0)
               if (common.rf_exit(icdev) == 0)
               {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            else
            {
                return false;
            }
        }

        //读写器发出提示音
        public static void BeepTip()
        {
              common.rf_beep(icdev, 10);//蜂鸣器鸣叫10毫秒
        }

        //读写器寻卡 -------------1
        public static Boolean SeekCard()
        {
            UInt16 tagtype = 0;
            mifareone.rf_reset(icdev, 3); //复位读写器
            if (mifareone.rf_request(icdev, 1, out tagtype) == 0) 
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        //获取卡的序列号------------------------------2
        public static string GetISN()
        {
              
              //request指令之后应立即调用anticoll，除非卡的序列号已知。

              if (mifareone.rf_anticoll(icdev, 0, out snr) != 0) //  //功 能：卡防冲突，返回卡的序列号,成功则返回 0
              {
                  return "获取卡的序列号失败!";
              }
              //返回卡的序列号
              return snr.ToString("X");//将返回的序列号转换为16进制   
        }

        //从可能出现多张卡中选取一张卡---------------3
        public static Boolean ChooseCard()
        {

            if (mifareone.rf_select(icdev, snr, out size) != 0) //功 能：从多个卡中选取一个给定序列号的卡,成功返回0
            {
                return false;//选卡失败
            }
            return true;//选卡成功
        }
        //---------------------------------------(上面123，三个函数时连续调用的)


        //验证扇区密码
                                    //参数1是扇区密码12位十六进制数,参数2是需要验证密码的扇区号
        public static Boolean CheckPassword(string pass,int sector) //sector扇区号取值范围是0-15,由于0扇区厂家写有数据，这里只是用1-15
        {
			byte[] AsciiKey=new byte[17];
			byte[] HexKey=new byte[7];

            AsciiKey = Encoding.ASCII.GetBytes(pass); //把十六进制密码字符串转换为字节数组
            common.a_hex(AsciiKey, HexKey, 12); //ASCLL字节数组的密码转为十六进制

            common.rf_load_key(icdev, 0, sector, HexKey);//将密码装入读写模块RAM中，成功返回0

            //验证某一扇区密码,只有装入后才能使用验证密码函数验证
			if(mifareone.rf_authentication(icdev, 0, sector)!=0)//返回值不为0验证失败
            {
                return false; //验证扇区密码错误
            }
			else
            {
				return true;  //验证扇区密码正确
            }
        }

        // ------读取余额，返回字符串
        public static string ReadRestMoney(int sector)
        {         
            uint value;
            //参数1是设备标示符，参数2是块地址0-63，参数3是用来接收数据的缓冲          
            //sector * 4 + 0对应的是sector扇区的第1块，这里应该读取块4
            if (mifareone.rf_readval(icdev, sector * 4 + 0, out value) == 0)//读取扇区内的0块的数据，成功返回0
            {
                //上面读取到的余额的单位是角钱，转换成元
                double rest_money = value / 10.0;
                return rest_money.ToString();
            }
            else
            {
                return "读取余额失败";
            }

        }
        //读取卡号，返回字符串
        public static string ReadMemberID(int sector)
        {
            int i = 0;
            byte[] data = new byte[16]; //定义16字节数组接收数据
            for (i = 0; i < 16; i++)
                data[i] = 0;
            //参数1是设备标示符，参数2是块地址0-63，参数3是用来接收数据的缓冲

            //sec * 4 + 1对应的是sec扇区的第2块，这里应该读取块5
            if (mifareone.rf_read(icdev, sector * 4 + 1, data) == 0)//读取扇区内的1块的数据，成功返回0
            {
                return System.Text.Encoding.Default.GetString(data).Substring(0,8);//截取卡号字符串的前八位，数据共16位，后八位是前八位的重复         
            }
            else
            {
                return "读取卡号失败";
		    }
        }

        //增加余额
        public static Boolean  InRestMoney(string addValue,int sector)
        {     
            float value = float.Parse(addValue);//字符串数据转float
            uint incre_momey =  uint.Parse((value * 10).ToString()); //把存入的元转换成角		
            //这里把float转换为字符串，再转型为uint，如果直接把float转型uint可能会丢1小数点精度

            if (mifareone.rf_increment(icdev, sector * 4 + 0, incre_momey) == 0)
            {
               return true;//加钱成功,写入的是角钱
            }
            else
            {
               return false;
            }
        }

        //减掉余额
        public static Boolean DeRestMoney(string subValue,int sector)
        {
            float value = float.Parse(subValue);  //字符串元转换成float元
            uint decre_momey = uint.Parse((value * 10).ToString()); //元转换成角钱
   
            if (mifareone.rf_decrement(icdev, sector * 4 + 0, decre_momey) == 0)
            {
                return true;            
            }
            else
            {
                return false;
            }       
        }

        //写入卡号
        public static Boolean WriteCardID(string cardID,int sector)
        {              
           String card_num = cardID + cardID;//获取会员卡号字符串
           byte[] data = System.Text.Encoding.Default.GetBytes(card_num);//字符串转换成byte数组
           if (mifareone.rf_write(icdev, sector*4+1, data) == 0)//写第5块
           {
               return true; //写入成功
           }
           else
           {
               return false;//写入失败
           }
       }

        ////初始化卡的金额 -----------调用传递金额参数时，应该检查int钱的范围是否超出类型
        //public static Boolean InitialRestMoney(string InitialMoney,int sector)
        //{
        //    uint value = uint.Parse(InitialMoney); //金额字符串转换成整形
        //    if (mifareone.rf_authentication(icdev, 0, sector) == 0) //验证密码成功才可以初始化
        //    {
        //        if (mifareone.rf_initval(icdev, sector * 4 + 0, value) != 0) //如果是第一扇区那就是块4
        //        {
        //            return false; //初始化失败
        //        }
        //        else
        //        {
        //            return true; //初始化成功
        //        }
        //    }
        //    else
        //    {
        //        return false;//密码验证失败也返回初始化失败
        //    }
        //}
        //初始化卡号和金额

        public static Boolean InitialCard(string cardID,string InitialMoney, int sector)
        {
            float momey = float.Parse(InitialMoney);
        //    uint value = (uint)(); //金额字符串转换成整形//元转换成角

          uint value =   uint.Parse((momey* 10).ToString());
                
                 //验证密码成功才可以初始化
                if ((mifareone.rf_initval(icdev, sector * 4 + 0, value) == 0) && WriteCardID(cardID, sector)==true) //如果是第一扇区那就是块4
                {
                    return true; //初始化成功
                }
                else
                {
                    return false; //初始化失败
                }                 
        }

    }
}
